觀前提醒:
The count-and-say sequence is the sequence of integers with the first five terms as following:
1. 1
2. 11
3. 21
4. 1211
5. 111221
1
is read off as "one 1"
or 11.
11
is read off as "two 1s"
or 21
.21
is read off as "one 2, then one 1"
or 1211
.
Given an integer n where 1 ≤ n ≤ 30, generate the nth term of the count-and-say sequence. You can do so recursively, in other words from the previous member read off the digits, counting the number of digits in groups of the same digit.
Note: Each term of the sequence of integers will be represented as a string.
Example 1:
Input: 1
Output: "1"
Explanation: This is the base case.
Example 2:
Input: 4
Output: "1211"
Explanation: For n = 3 the term was "21" in which we have two groups "2" and "1", "2" can be read as "12" which means frequency = 1 and value = 2, the same way "1" is read as "11", so the answer is the concatenation of "12" and "11" which is "1211".
這題呢,小弟資質駑鈍,直接使用土方法暴力解決,詳情請直接參考下方 CODE + 註解
/**
* @param {number} n
* @return {string}
*/
var countAndSay = function (n) {
// 處理 edge case
if (n === 1) {
return "1";
}
let countSay = "1";
for (let i = 1; i <= n - 1; i++) {
// ASK: 為什麼是 1~n-1?
// 因為第0趟時,countSay === "1";已經處理過了。
let digit = countSay.charAt(0); //從左側開頭開始數
let temp = countSay; // 先把整包 countSay 賦值給 temp。
let count = 0;
countSay = ""; // 清空儲存這輪數完的字串
for (let j = 0; j <= temp.length - 1; j++) {
// 數字相同,count++
if (temp.charAt(j) === digit) {
count++;
} else {
// 數字不同,將目前的 count 與digit加到字串,更新 digit,新的 count 從 "1" 開始數起
countSay += count;
countSay += digit;
digit = temp.charAt(j);
count = 1;
}
}
// 當讀取到最後一位時,直接把計算好的結果加總到 countSay 後頭
countSay += count;
countSay += digit;
}
return countSay;
};
謝謝大家的收看,LeetCode 小學堂我們下次見~